home *** CD-ROM | disk | FTP | other *** search
/ The Arsenal Files 4 / The Arsenal Files 4 (Arsenal Computer).ISO / casm / au116-as.exe / DIR.CPP < prev    next >
C/C++ Source or Header  |  1994-08-12  |  6KB  |  238 lines

  1. // dir.CPP                                     1          1    6666
  2. // Dave Harris                                11         11   6
  3. // Compiled using Borland C++ ver 3.1       1 1        1 1   6666
  4. // 03-03-94                                  1     ..   1   6   6
  5. //                                           11111 .. 11111  666
  6. ////////////////////////////////////////////////////////////////////////
  7.  
  8. #include "au.hpp"
  9. #include <time.h>
  10.  
  11. /*********************************************************************/
  12. /* Define Statements */
  13. /*********************/
  14.  
  15. #define PROGRAM "DIR"    // Name of module
  16.  
  17. typedef struct
  18. {
  19.     char list_order[50];
  20. } DIR_INFO;
  21.  
  22. /*░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░*/
  23. static int dir(AU *au, char *file_name)
  24. {
  25.     DIR_INFO *in = (DIR_INFO *)au->info;
  26.     struct ffblk ffblk;           // directory entry structure
  27.     int i;
  28.     int size;
  29.     DATE date1, date2;
  30.     date datep;
  31.     char temp[FILE_SIZE];
  32.     char disp_string[200];
  33.     char piece[80];
  34.     char *ptr;
  35.  
  36.     check_for_key();
  37.  
  38.     disp_string[0] = '\0';
  39.     if (!findfirst(file_name, &ffblk, 0))
  40.     {
  41.         i=0;
  42.         while (in->list_order[i] != '\0')
  43.         {
  44.             size = 0;
  45.             if (isdigit(in->list_order[i]))
  46.             {
  47.                 size = atoi(in->list_order+i);
  48.                 if (size > 32 || size < 0)
  49.                 {
  50.                     au_printf_error(au, "Illegal size specifier (%d)", size);
  51.                     exit(1);
  52.                 }
  53.                 i = i + ((size < 10) ? 1 : 2);
  54.                 if (in->list_order[i] == '\0')
  55.                 {
  56.                     au_printf_error(au, "Size specifier not attached to an order");
  57.                     exit(1);
  58.                 }
  59.             }
  60.             switch (in->list_order[i])
  61.             {
  62.             case 'A':
  63.                 getdate(&datep);                  // Current date */
  64.                 date1.year    = datep.da_year - 1900;
  65.                 date1.month = datep.da_mon;
  66.                 date1.day    = datep.da_day;
  67.                 fdate_to_date(&date2, &ffblk);
  68.                 if (size == 0)
  69.                     size = 6;
  70.                 sprintf(piece, "%*ld", size, days_diff(&date2, &date1));
  71.                 break;
  72.             case 'D':
  73.                 fdate_to_date(&date1, &ffblk);
  74.                 if (size == 0)
  75.                     size = 8;
  76.                 sprintf(piece, "%*s", size, date_to_string(&date1));
  77.                 break;
  78.             case 'E':
  79.                 if (size == 0)
  80.                     size = FILE_EXT-1;
  81.                 ptr = strchr(file_name, '.');
  82.                 if (ptr != NULL)
  83.                     sprintf(piece, "%-*s", size, ptr+1);
  84.                 break;
  85.             case 'N':
  86.                 if (size == 0)
  87.                     size = FILE_SIZE-1;
  88.                 sprintf(piece, "%-*s", size, file_name);
  89.                 break;
  90.             case 'P':
  91.                 strcpy(temp, file_name);
  92.                 ptr = strchr(temp, '.');
  93.                 if (ptr != NULL)
  94.                     *ptr = '\0';
  95.                 if (size == 0)
  96.                     size = FILE_PREF-1;
  97.                 sprintf(piece, "%-*s", size, temp);
  98.                 break;
  99.             case 'S':
  100.                 if (size == 0)
  101.                     size = 10;
  102.                 sprintf(piece, "%*ld", size, ffblk.ff_fsize);
  103.                 break;
  104.             case 'T':
  105.                 sprintf(temp, "%02d:%02d:%02d",
  106.                          (ffblk.ff_ftime & 0xF800) >> 11,
  107.                          (ffblk.ff_ftime & 0x07E0) >> 5,
  108.                          (ffblk.ff_ftime & 0x001F) * 2);
  109.                 if (size == 0)
  110.                     size = 8;
  111.                 sprintf(piece, "%*s", size, temp);
  112.                 break;
  113.             case 'X':
  114.                 if (size == 0)
  115.                     size = 4;
  116.                 sprintf(piece, "%0*x", size, crc16(au, file_name));
  117.                 break;
  118.             case 'Y':
  119.                 if (size == 0)
  120.                     size = 8;
  121.                 sprintf(piece, "%0*lx", size, crc32(au, file_name));
  122.                 break;
  123.             case '_':
  124.                 sprintf(piece, "");
  125.                 break;
  126.             case '.':
  127.             {
  128.                 int len = strlen(disp_string);
  129.                 if (len > 0)
  130.                     disp_string[len-1] = '\0';
  131.                 i++;
  132.                 continue;
  133.             }
  134.             default:
  135.                 au_printf_error(au, "Unknown list piece '%c'", in->list_order[i]);
  136.                 exit(1);
  137.             }
  138.             strcat(disp_string, piece);
  139.             strcat(disp_string, " ");
  140.             i++;
  141.         }
  142.         au_printf(au, "%s", disp_string);
  143.         safe_string_copy(au->env_cont, disp_string, CLENGTH, FALSE);
  144.         au_printf(au, "\n");
  145.     }
  146.     return 0;
  147. }
  148. /*░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░*/
  149. static void ReadCFGInfo(AU *au, CFG_HANDLE *cfg_handle)
  150. {
  151.     char string[200],
  152.          string2[200],
  153.          string3[200];
  154.  
  155.     DIR_INFO *in = (DIR_INFO *)au->info;
  156.  
  157.     for(EVER)
  158.     {
  159.         if (cfg_handle->read_line(au, string)==EOF)
  160.             break;
  161.  
  162.         split_string(string, string2);
  163.         split_string(string, string3);
  164.  
  165.         if (string2[0] == '\0')
  166.             continue;
  167.  
  168.         strcpy(au->curOpt,string2);
  169.         au->curVal = string3;
  170.         switch (toupper(string2[1]) << 8 | toupper(string2[0]))
  171.         {
  172.             case 'BE':                                          // Begin
  173.                 return;
  174.             case 'LI':                                          // List_Order
  175.                 strcpy(in->list_order, string3);
  176.                 break;
  177.             default:
  178.                 cfg_handle->invalid_option(au, string2);
  179.         }
  180.     }
  181. }
  182. /*░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░*/
  183. static BYTE parse_comm_line(AU *au, char option, char *cur_argv,
  184.                             PARSE_TYPE type)
  185. {
  186.     DIR_INFO *in = (DIR_INFO *)au->info;
  187.  
  188.     switch (type)
  189.     {
  190.     case PARSE_PARAM_OPTION:
  191.         switch (option)
  192.         {
  193.         case 'L':
  194.             safe_string_copy(in->list_order, cur_argv, 30, FALSE);
  195.             strupr(in->list_order);
  196.             break;
  197.         case '?':
  198.             au_standard_opt_header(au, "DIr",
  199.                "@?3-L@?Dx@?H              @?3L@?Hist order, where @?Dx@?H = string of:\n"
  200.                "  @?DA@?H - @?DA@?Hge\n"
  201.                "  @?DD@?H - @?DD@?Hate\n"
  202.                "  @?DE@?H - file @?DE@?Hxtension\n"
  203.                "  @?DN@?H - file @?DN@?Hame\n"
  204.                "  @?DP@?H - file @?DP@?Hrefix\n"
  205.                "  @?DS@?H - @?DS@?Hize\n"
  206.                "  @?DT@?H - @?DT@?Hime\n"
  207.                "  @?DX@?H - 16 bit CRC\n"
  208.                "  @?DY@?H - 32 bit CRC\n"
  209.                "  @?D_@?H - Extra space\n"
  210.                "  @?D.@?H - No space between\n"
  211.                "\n"
  212.                "  In front of each, an optional size specifier may be placed\n");
  213.             exit (0);
  214.         default:
  215.             au_invalid_option(au, PROGRAM, option);
  216.         }
  217.         return TRUE;
  218.     }
  219.     return FALSE;
  220. }
  221. /*░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░*/
  222. int main_dir(AU *au, int argc, char *argv[])
  223. {
  224.     DIR_INFO *in;
  225.  
  226.     in = new DIR_INFO;
  227.     memset(in, '\0', sizeof(DIR_INFO));
  228.     au->info = in;
  229.     strcpy(in->list_order, "NSDT3");
  230.  
  231.     ReadGlobalCFGInfo(au, au->cfg_file, PROGRAM, ReadCFGInfo);
  232.     generic_parse_comm_line(au, argc, argv, parse_comm_line);
  233.     process_files(au, dir);
  234.  
  235.     return 0;
  236. }
  237.  
  238.